#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>

#include "proto.h"

#define IPSTRSIZE 40

int main()
{

	int sockfd;
	struct sockaddr_in localaddr, remoteaddr;	// 此处使用的结构体和用的协议族有关系，ipv4对应的结构体是sockaddr_in
	struct msg_st rbuf;							// 接收传递进来的数据
	socklen_t remoteaddr_len;					// 接收传递进来的数据长度
	char ipstr[IPSTRSIZE];						// 字符串ip

	/*
	 *	AF_INET		表示使用ipv4协议
	 *	SOCK_DGRAM	表示使用报式套接字
	 *	0			表示使用ipv4协议中的默认协议，IPPROTO_UDP
	 * */
	sockfd = socket(AF_INET, SOCK_DGRAM, 0);
	if(sockfd < 0){
		perror("socket()");
		exit(1);
	}

	localaddr.sin_family = AF_INET;
	localaddr.sin_port = htons(atoi(RECPORT));			// h to n s 解决数据大小端的问题
	inet_pton(AF_INET, "0.0.0.0", &localaddr.sin_addr);	// inet_pton转换0.0.0.0字符串ip到整型ip

	// 绑定ip，供客户端访问
	if(bind(sockfd, (void *)&localaddr, sizeof(localaddr)) < 0){
		perror("bind()");
		exit(1);
	}

	remoteaddr_len = sizeof(remoteaddr);
	int ret;
	while (1) {
		ret = recvfrom(sockfd, &rbuf, sizeof(rbuf), 0, (void *)&remoteaddr,&remoteaddr_len);		// 报式套接字接收数据方式
		if(ret < 0){
			perror("recvfrom()");
			exit(1);
		}
		inet_ntop(AF_INET, &remoteaddr.sin_addr, ipstr, IPSTRSIZE);								// inet_ntop转换整型ip到字符串ip
		printf("--------MESSAGE from %s:%d---------- \n", ipstr, ntohs(remoteaddr.sin_port));	// 打印ip和port，n to h s 大小端转换
		printf("NAME: %s \n",rbuf.name);
		printf("MATH: %d \n",ntohs(rbuf.math));
		printf("CHINESE: %d \n",ntohl(rbuf.chinese));
	}

	close(sockfd);

	exit(0);
}
